AWS Step FunctionsステートマシンからDynamoDBテーブルのスキャンをする
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、AWS Step FunctionsステートマシンからDynamoDBテーブルのスキャンをする方法を確認してみました。
背景
AWS Step Functionsでは、AWSの各種データベースサービスに対してAPIを使用した処理を行うことができます。
もともとDynamoDBのクエリ操作について調べる予定だったのですがパラメータの書き方でハマりったので、代わりにもっと単純と思われるにスキャンの動作で試していたところ権限周りで少し注意が必要だったので、書き残すことにしました。
やってみた
ステートマシンの作成
Step Functions Workflow Studioでステートマシンを作成します。
Step Functionsのマネジメントコンソールでステートマシンの作成を開始します。
[次へ]をクリックします。
[action]をscan
で検索して[DynamoDB Scan]をドラッグします。
[Scan]の[設定]で、[APIパラメータ]でテーブル名を指定したら、[次へ]をクリックします。
生成されたコードを確認したら[次へ]をクリックします。
生成されたコード(ステートマシン定義)は下記のようになります。
{ "Comment": "A description of my state machine", "StartAt": "Scan", "States": { "Scan": { "Type": "Task", "End": true, "Parameters": { "TableName": "taxiCrews" }, "Resource": "arn:aws:states:::aws-sdk:dynamodb:scan" } } }
ステートマシン設定の確認をします。[アクセス許可]-[実行ロール]で新しいロールを自動作成するようにしていますが、
その場合にDynamoDBのScanアクションを許可するロールは自動で作成されないようで、下記のような警告が出ます。 1
一旦ここでは作成を完了します。
ステートマシンを作成できました。しかしこのままでは権限が不足しているため実行をしても失敗します。
[IAMでロールを編集]からロールへの許可の追加をできるようなのでクリックします。
現状X-Rayを使用するポリシーしかアタッチされていないようです。
今回はスキャンをしたいので、AmazonDynamoDBReadOnlyAccess
をアタッチします。
動作
Step Functionsのコンソールに戻り、ステートマシンを実行します。入力の指定はデフォルトのままです。
実行が成功しました。
テーブル上のデータがスキャンできています。取得結果はDynamoDB JSON形式となるようです。
補足
その他のパラメータ
今回テーブルスキャン時にパラメータとして指定したのはtableName
のみでしたが、その他のパラメータも利用可能です。
全件取得
一度のスキャン操作で取得できるデータサイズは最大1MBです。1MB以上のデータを全件取得したい場合はステートマシン上でMapによるループを使用するなどの工夫が必要です。
DynamoDB では、Scan オペレーションの結果をページ割りします。ページ割りを行うことで Scan 結果が 1 MB サイズ (またはそれ以下) のデータの「ページ」に分割されます。アプリケーションは結果の最初のページ、次に 2 ページと処理できます。
1 つの Scan は、サイズの制限である1 MB 以内の結果セットだけを返します。さらに結果があるかどうかを確認して、一度に 1 ページずつ結果を取り出すには、アプリケーションで次の操作を行う必要があります。
おわりに
AWS Step FunctionsステートマシンからDynamoDBテーブルのスキャンをする方法を確認してみました。
DynamoDBにアクセスするステートマシンをStep Functions Workflow Studioから作成する場合に権限周りで少し注意が必要でした。次回はもともとやりたかったクエリを試してみたいと思います。
以上